#ifndef __SEQLIST_H__
#define __SEQLIST_H__

/**
 * 遍历顺序表的回调函数
 */
typedef void (*vector_visitor)(int);

typedef struct vector {
    // 顺序表中当前元素个数
    unsigned int length;
    // 顺序表的容量（即最大能容纳的元素个数）
    unsigned int capicity;
    // 顺序表的数据部分
    int data[0];
} vector;

/**
 * 创建一个新的顺序表
 * @param capacity 顺序表的容量
 * @return 返回新创建的顺序表
 */
extern vector* new_vector(unsigned capacity);

/**
 * 返回顺序表的长度
 * @param list 顺序表的指针
 */
extern unsigned int vector_length(const vector* list);

/**
 * 向顺序表中第position个元素后面插入新元素
 * @param list 顺序表指针
 * @param val  待插入的元素
 * @param position 插入位置
 * @return 插入成功，返回新的顺序表，否则返回空
 */
extern vector* vector_insert(vector *list, int val, int position);

/**
 * 向顺序表中追加元素
 * @param list 顺序表指针
 * @param val 待插入值
 * @return 插入成功，返回新的顺序表，否则返回空
 */
extern vector* vector_append(vector *list, int val);

/**
 * 删除顺序表中第position个元素
 * @param list 顺序表指针
 * @param position 要删除的元素的位置
 * @return 返回被移除的元素
 */
extern int vector_remove(vector* list, int position);

/**
 * 遍历线性表
 */
extern void vector_for_each(vector* list, vector_visitor visitor);

/**
 * 销毁线性表
 */
extern void vector_release(vector* list);

/**
 * 是否为空表
 * @return 空表返回1，非空表返回0
 */
extern int vector_empty(vector* list);

/**
 * 访问链表的第position个位置的元素
 * @param position 元素位置
 */
extern int vector_get_at(vector* list, int position);

/**
 * 修改链表的第position个位置的元素
 * @param val 新的值
 * @param position 元素位置
 */
extern void vector_set_at(vector* list, int val, int position);

#endif